﻿using System;

namespace SoftwareConsulting.BI11.NumericalMethods.Interpolation
{
    /// <summary>
    /// Класс интерполяции Невиля
    /// </summary>
    /// <remarks>
    /// Полиномиальная интерполяция
    /// Используется алгоритм Невилля, не  требующий  предварительного  вычисления
    /// таблицы коэффициентов, но имеющий трудоемкость O(N^2)
    /// Входные параметры:
    /// X   -   абсциссы точек;                    
    /// F   -   значения функций в этих точках;                    
    /// N   -   число точек;
    /// T   -   точка, в которой осуществляется интерполяция
    /// Результат:
    /// значение интерполяционного полинома в точке T
    /// </remarks>
    public class NevilleInterpolation 
    {
        private double _result;

        /// <summary>
        /// Конструктор по умолчанию
        /// </summary>                
        public NevilleInterpolation( double[] x,double[] f,int n,double t)
        {
            _result = 0;
            int m = 0;
            int i = 0;
            f = (double[])f.Clone();
            n = n - 1;
            for (m = 1; m <= n; m++)
            {
                for (i = 0; i <= n - m; i++)
                {
                    f[i] = ((t - x[i + m]) * f[i] + (x[i] - t) * f[i + 1]) / (x[i] - x[i + m]);
                }
            }
            _result = f[0];
        }

        /// <summary>
        /// Возвращает решение
        /// </summary>        
        public double GetSolution()
        {
            return _result;
        }
    }
}
